=begin pod :kind("Type") :subkind("class") :category("basic")

=TITLE class Proxy

=SUBTITLE Item container with custom storage and retrieval

    class Proxy {}

A Proxy is an object that allows you to set a hook that executes whenever a
value is retrieved from a container (C<FETCH>) or when it is set (C<STORE>).
Please note that C<Proxy> can introduce mutability at places where it would
break behavior, e.g. in C<Hash> keys.

To create a container that returns twice what was stored in it, you do something
like this:

=begin code :method
sub double() is rw {
    my $storage = 0;
    Proxy.new(
        FETCH => method ()     { $storage * 2    },
        STORE => method ($new) { $storage = $new },
    )
}
my $doubled := double();
$doubled = 4;
say $doubled;       # OUTPUT: «8␤»
=end code

=head1 Methods

=head2 method new

    method new(:&FETCH!, :&STORE! --> Proxy:D)

Creates a new C<Proxy> object. C<&FETCH> is called with one argument (the
proxy object) when the value is accessed, and must return the value that the
fetch produces. C<&STORE> is called with two arguments (the proxy object, and
the new value) when a new value is stored in the container.

=end pod

# vim: expandtab softtabstop=4 shiftwidth=4 ft=perl6
